djp = (function(){
  var
  documentElement = document.documentElement,
  sUndefined = 'undefined',
  NodeProxy = function(n){
    this.node = n
  };
  NodeProxy.prototype = {
    contains: documentElement.contains ?
      function (b){
        return this.node == b || this.node.contains(b)
      }:
      function (b){
        return this.node == b || (this.node.compareDocumentPosition(b) & 16)
      },
    setText: typeof documentElement != sUndefined ?
      function(value){
        this.node.innerText = value
      }:
      function(value){
        this.node.textContent = value
      },
    getText: typeof nod.innerText != sUndefined ?
      function(){
        return this.node.innerText
      }:
      function(){
        return this.node.textContent
      },
    getAttr: function(){
      var oNode = this.node, getAttr='getAttribute', getAttrNode=getAttr+'Node';
      return oNode.nodeType == 1 && oNode[getAttr](attrName, 2)||((oNode[getAttrNode]&&(oNode=oNode[getAttrNode](attrName)))?oNode.nodeValue:'')
    },
    /**
     * 
     */
    ancestor: function(){
      
    },
    next: function(){
      
    },
    following: function(){
      
    },
    prev: function(){
      
    },
    preceding: function(){
      
    },
    /**
     * Подбирает цепочку элементов, 
     */
    seek: function(){
      
    },
    /**
     * Подключает обработчик к событию
     * @param {Function} сallback функция, вызываемая при событии.<br>Ей передается параметр<br> {e:DOMEvent, node:e.target, pos:{X:0,Y:0}, cancel:function(){e.preventDefault()}}
     * @param {String} eventType тип события.
     * @return {Function} функция - отключения/включения обработчика события.
     */
    attach: document.addEventListener ?
      function(callback, eventType){
        var
        isAttached,
        rootEventNode = this.node,
        handler = function(e){
          /* не обрабатывать клик правой кнопки мыши */
          if((e.type=='click' || e.type=='mousedown') && e.button) return
          callback({
            e: e,
            node: e.target,
            pos: {X: e.pageX, Y: e.pageY},
            cancel: function(){e.preventDefault()}
          })
        };
        (function toggle(){
          rootEventNode[
            ((isAttached=!isAttached) ?'add':'remove')+'EventListener'
          ](eventType, handler, false)
        })();
        return toggle
      }:
      function(callback, eventType){
        var rootEventNode = this.node,
        handler = function(){
          var e = window.event,
          t = document.documentElement,
          o = {'X':'Left','Y':'Top'},
          p = {
            e:e,
            node: e.srcElement || document,
            pos:{},
            cancel: function(){
              e.returnValue = false
            }
          }, k, scroll = 'scroll';
          for (k in o) {
            p.pos[k] = e['client'+k]+t[scroll+o[k]]
          }
          if (t = document.body) for (k in o) {
            p.pos[k] += t[scroll+o[k]]
          };
          callback(p)
        };
        (function toggle(){
          rootEventNode[
            ((isAttached=!isAttached) ?'attach':'detach')+'Event'
          ]('on' + eventType, handler)
        })();
        return toggle
      },
    /**
     * Конструктор "Наблюдателя", ищущего по определенным критериям,
     * в принявшем событие элементе и его родителях, элемент, который хотим обработать.
     * <ul>
     * <li>вызывает <i>функцию обработки события в елементе</i>, передавая найденные элементы и координаты события на странице</li>
     * <li>если событие произошло вне элемента, вызывается <i>функция обработки события вне элемента</i>.</li>
     * <li>если функция обработки возвращает "ложь", типичная реакция браузера на событие отменяется.</li>
     * </ul>
     * @param {String} eventType тип наблюдаемого события
     * @param {Function} fElementsSelectors критерии отбора,<br>
     * если событие было на наблюдаемых элементах, эта функция возвращает массив найденных совпадений.
     * Каждое совпадение хранит массив запомненных элементов, первыми идут дочерние элементы.
     * @param {String} intoSelectorsMethod имя метода, вызываемого при событии на наблюдаемом узле.
     * @param {String} outSelectorsMethod имя метода, вызываемого при событии вне наблюдаемого узла.
     */
    watchEvent: function(eventType){
      var self = this, eventDeferred = djp.deferred;
      self.attach(
        function(p){
          eventDeferred.setValue(p)
        },
        eventType
      )
    },
    insertHTML: function(sWhere,sHTML){
      return this
    }
  }
  return function(node){
    return new NodeProxy(node || documentElement)
  }
})();

[{'<node1':[{'<node2':[]}]}]